FVP: Do not power off secondary CPUs when booting an EL3 payload
authorSandrine Bailleux <[email protected]>
Fri, 2 Oct 2015 13:35:25 +0000 (14:35 +0100)
committerAchin Gupta <[email protected]>
Thu, 26 Nov 2015 21:32:04 +0000 (21:32 +0000)
Normally, in the FVP port, secondary CPUs are immediately powered
down if they are powered on at reset. However, when booting an EL3
payload, we need to keep them powered on as the requirement is for
all CPUs to enter the EL3 payload image. This patch puts them in a
holding pen instead of powering them off.

Change-Id: I6526a88b907a0ddb820bead72f1d350a99b1692c

docs/porting-guide.md
plat/arm/board/fvp/aarch64/fvp_helpers.S

index 5e823e8150a2a50f726b1365dd7eaca393a84e34..82bed6b0480e278362277878e7b41c8556f18832 100644 (file)
@@ -468,9 +468,11 @@ for placing the executing secondary CPU in a platform-specific state until the
 primary CPU performs the necessary actions to bring it out of that state and
 allow entry into the OS. This function must not return.
 
-In the ARM FVP port, each secondary CPU powers itself off. The primary CPU is
-responsible for powering up the secondary CPU when normal world software
-requires them.
+In the ARM FVP port, when using the normal boot flow, each secondary CPU powers
+itself off. The primary CPU is responsible for powering up the secondary CPUs
+when normal world software requires them. When booting an EL3 payload instead,
+they stay powered on and are put in a holding pen until their mailbox gets
+populated.
 
 This function fulfills requirement 2 above.
 
index 865c615a3ee0e9382e8349baf99502f698fb14be..2c24e61f95c09874db837a3ef21c9e34465b94ad 100644 (file)
@@ -60,6 +60,7 @@
         * -----------------------------------------------------
         */
 func plat_secondary_cold_boot_setup
+#ifndef EL3_PAYLOAD_BASE
        /* ---------------------------------------------
         * Power down this cpu.
         * TODO: Do we need to worry about powering the
@@ -93,6 +94,18 @@ func plat_secondary_cold_boot_setup
        wfi
 cb_panic:
        b       cb_panic
+#else
+       mov_imm x0, PLAT_ARM_TRUSTED_MAILBOX_BASE
+
+       /* Wait until the entrypoint gets populated */
+poll_mailbox:
+       ldr     x1, [x0]
+       cbz     x1, 1f
+       br      x1
+1:
+       wfe
+       b       poll_mailbox
+#endif /* EL3_PAYLOAD_BASE */
 endfunc plat_secondary_cold_boot_setup
 
        /* ---------------------------------------------------------------------